<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.6.6" />
<title>Release notes for Gerrit 2.8</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */

/* Default font. */
body {
  font-family: Georgia,serif;
}

/* Title font. */
h1, h2, h3, h4, h5, h6,
div.title, caption.title,
thead, p.table.header,
#toctitle,
#author, #revnumber, #revdate, #revremark,
#footer {
  font-family: Arial,Helvetica,sans-serif;
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}
h5 {
  font-size: 1.0em;
}

div.sectionbody {
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}
ul > li     { color: #aaa; }
ul > li > * { color: black; }

pre {
  padding: 0;
  margin: 0;
}

#author {
  color: #527bbd;
  font-weight: bold;
  font-size: 1.1em;
}
#email {
}
#revnumber, #revdate, #revremark {
}

#footer {
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid #dddddd;
  border-left: 4px solid #f0f0f0;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid #dddddd;
  border-left: 5px solid #f0f0f0;
  background: #f8f8f8;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #f0f0f0;
  color: #888;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > pre.content {
  font-family: inherit;
  font-size: inherit;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}

div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}

div.colist td {
  padding-right: 0.5em;
  padding-bottom: 0.3em;
  vertical-align: top;
}
div.colist td img {
  margin-top: 0.3em;
}

@media print {
  #footer-badges { display: none; }
}

#toc {
  margin-bottom: 2.5em;
}

#toctitle {
  color: #527bbd;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}

span.aqua { color: aqua; }
span.black { color: black; }
span.blue { color: blue; }
span.fuchsia { color: fuchsia; }
span.gray { color: gray; }
span.green { color: green; }
span.lime { color: lime; }
span.maroon { color: maroon; }
span.navy { color: navy; }
span.olive { color: olive; }
span.purple { color: purple; }
span.red { color: red; }
span.silver { color: silver; }
span.teal { color: teal; }
span.white { color: white; }
span.yellow { color: yellow; }

span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }

span.big { font-size: 2em; }
span.small { font-size: 0.6em; }

span.underline { text-decoration: underline; }
span.overline { text-decoration: overline; }
span.line-through { text-decoration: line-through; }


/*
 * xhtml11 specific
 *
 * */

tt {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

div.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-weight: bold;
  color: #527bbd;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


/*
 * html5 specific
 *
 * */

.monospaced {
  font-family: monospace;
  font-size: inherit;
  color: navy;
}

table.tableblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
thead, p.tableblock.header {
  font-weight: bold;
  color: #527bbd;
}
p.tableblock {
  margin-top: 0;
}
table.tableblock {
  border-width: 3px;
  border-spacing: 0px;
  border-style: solid;
  border-color: #527bbd;
  border-collapse: collapse;
}
th.tableblock, td.tableblock {
  border-width: 1px;
  padding: 4px;
  border-style: solid;
  border-color: #527bbd;
}

table.tableblock.frame-topbot {
  border-left-style: hidden;
  border-right-style: hidden;
}
table.tableblock.frame-sides {
  border-top-style: hidden;
  border-bottom-style: hidden;
}
table.tableblock.frame-none {
  border-style: hidden;
}

th.tableblock.halign-left, td.tableblock.halign-left {
  text-align: left;
}
th.tableblock.halign-center, td.tableblock.halign-center {
  text-align: center;
}
th.tableblock.halign-right, td.tableblock.halign-right {
  text-align: right;
}

th.tableblock.valign-top, td.tableblock.valign-top {
  vertical-align: top;
}
th.tableblock.valign-middle, td.tableblock.valign-middle {
  vertical-align: middle;
}
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
  vertical-align: bottom;
}


/*
 * manpage specific
 *
 * */

body.manpage h1 {
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  border-top: 2px solid silver;
  border-bottom: 2px solid silver;
}
body.manpage h2 {
  border-style: none;
}
body.manpage div.sectionbody {
  margin-left: 3em;
}

@media print {
  body.manpage div#toc { display: none; }
}
</style>
<script type="text/javascript">
/*<![CDATA[*/
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  if (!toc) {
    return;
  }

  // Delete existing TOC entries in case we're reloading the TOC.
  var tocEntriesToRemove = [];
  var i;
  for (i = 0; i < toc.childNodes.length; i++) {
    var entry = toc.childNodes[i];
    if (entry.nodeName == 'div'
     && entry.getAttribute("class")
     && entry.getAttribute("class").match(/^toclevel/))
      tocEntriesToRemove.push(entry);
  }
  for (i = 0; i < tocEntriesToRemove.length; i++) {
    toc.removeChild(tocEntriesToRemove[i]);
  }

  // Rebuild TOC entries.
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  // Delete existing footnote entries in case we're reloading the footnodes.
  var i;
  var noteholder = document.getElementById("footnotes");
  if (!noteholder) {
    return;
  }
  var entriesToRemove = [];
  for (i = 0; i < noteholder.childNodes.length; i++) {
    var entry = noteholder.childNodes[i];
    if (entry.nodeName == 'div' && entry.getAttribute("class") == "footnote")
      entriesToRemove.push(entry);
  }
  for (i = 0; i < entriesToRemove.length; i++) {
    noteholder.removeChild(entriesToRemove[i]);
  }

  // Rebuild footnote entries.
  var cont = document.getElementById("content");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      var note = spans[i].getAttribute("data-note");
      if (!note) {
        // Use [\s\S] in place of . so multi-line matches work.
        // Because JavaScript has no s (dotall) regex flag.
        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
        spans[i].innerHTML =
          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
        spans[i].setAttribute("data-note", note);
      }
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
},

install: function(toclevels) {
  var timerId;

  function reinstall() {
    asciidoc.footnotes();
    if (toclevels) {
      asciidoc.toc(toclevels);
    }
  }

  function reinstallAndRemoveTimer() {
    clearInterval(timerId);
    reinstall();
  }

  timerId = setInterval(reinstall, 500);
  if (document.addEventListener)
    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
  else
    window.onload = reinstallAndRemoveTimer;
}

}
asciidoc.install(2);
/*]]>*/
</script>
</head>
<body class="article">
<div id="header">
<h1>Release notes for Gerrit 2.8</h1>
<span id="revnumber">version 2.8 (from v2.8-rc0)</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>Gerrit 2.8 is now available:</p></div>
<div class="paragraph"><p><a href="https://gerrit-releases.storage.googleapis.com/gerrit-2.8-rc0.war">
<a href="https://gerrit-releases.storage.googleapis.com/gerrit-2.8-rc0.war">https://gerrit-releases.storage.googleapis.com/gerrit-2.8-rc0.war</a></a></p></div>
</div>
</div>
<div class="sect1">
<h2 id="_schema_change">Schema Change</h2>
<div class="sectionbody">
<div class="paragraph"><p><strong>WARNING:</strong> This release contains schema changes.  To upgrade:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>  java -jar gerrit.war init -d site_path</tt></pre>
</div></div>
<div class="paragraph"><p><strong>WARNING:</strong> Upgrading to 2.8.x requires the server be first upgraded to 2.1.7 (or
a later 2.1.x version), and then to 2.8.x.  If you are upgrading from 2.2.x.x or
later, you may ignore this warning and upgrade directly to 2.8.x.</p></div>
<div class="paragraph"><p><strong>WARNING:</strong> The replication plugin now automatically creates missing repositories
on the destination if during the replication of a ref the target repository is
found to be missing. This is a change in behavior of the replication plugin. To go
back to the old behavior, set the parameter <tt>remote.NAME.createMissingRepositories</tt>
in the <tt>replication.config</tt> file to <tt>false</tt>.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_release_highlights">Release Highlights</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/intro-change-screen.html">
New change screen</a> with completely redesigned UI and fully using the REST API.
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-gerrit.html#index">
Secondary indexing with Lucene and Solr</a>.
</p>
</li>
<li>
<p>
Lots of new <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api.html">
REST API endpoints</a>.
</p>
</li>
<li>
<p>
New
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#ui_extension">
UI extension</a> and
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/js-api.html">
JavaScript API</a> for plugins.
</p>
</li>
<li>
<p>
New build system using Facebook&#8217;s <a href="http://facebook.github.io/buck/">Buck</a>.
</p>
</li>
<li>
<p>
New core plugin: Download Commands.
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_new_features">New Features</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_build">Build</h3>
<div class="ulist"><ul>
<li>
<p>
Gerrit is now built with
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-buck.html">
Buck</a>.
</p>
</li>
<li>
<p>
Documentation is now built with Buck and <a href="http://asciidoctor.org">Asciidoctor</a>.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_configuration">Configuration</h3>
<div class="ulist"><ul>
<li>
<p>
Project owners can define <tt>receive.maxObjectSizeLimit</tt> in the
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-gerrit.html#receive.maxObjectSizeLimit">
project configuration</a> to further reduce the global setting.
</p>
</li>
<li>
<p>
Site administrators can define a
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-mail.html#_footer_vm">
footer template</a> that will be appended to the end of all outgoing emails after
the <em>ChangeFooter</em> and <em>CommentFooter</em>.
</p>
</li>
<li>
<p>
New <tt>topic-changed</tt> hook and stream event is fired when a change&#8217;s topic is
edited from the Web UI or via a REST API.
</p>
</li>
<li>
<p>
New options <tt>--list-plugins</tt> and <tt>--install-plugins</tt> on the
<a href="">http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/pgm-init.html[
site initialization command</a>.
</p>
</li>
<li>
<p>
New <tt>auth.httpDisplaynameHeader</tt> and <tt>auth.httpEmailHeader</tt> in the
<a href="">http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-gerrit.html#_a_id_auth_a_section_auth[
authentication configuration</a>.
</p>
<div class="paragraph"><p>When using HTTP-based authentication, the SSO can be delegated to check not only
the user credentials but also to fetch the full user-profile.</p></div>
<div class="paragraph"><p>With the config properties <tt>auth.httpDisplaynameHeader</tt> and <tt>auth.httpEmailHeader</tt>
it is possible to configure the name of the headers used for propagating this extra
information and enforce them on the user profile during login and beyond.</p></div>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config_gerrit.html#_a_id_httpd_a_section_httpd">
Customizable registration page for HTTP authentication</a>.
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config_gerrit.html#_a_id_httpd_a_section_httpd">
Configurable external <tt>robots.txt</tt> file</a>.
</p>
</li>
<li>
<p>
Support for
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/database-setup.html#createdb_oracle">
Oracle database</a>.
</p>
</li>
<li>
<p>
New bash completion script for autocompletion of parameters to the gerrit.sh wrapper.
</p>
</li>
<li>
<p>
The site can be
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-auto-site-initialization.html">
auto-initialized on server startup</a>.
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config_gerrit.html#httpd.filterClass">
Configurable filtering of HTTP traffic through Gerrit&#8217;s HTTP protocol</a>.
</p>
</li>
<li>
<p>
Labels can be
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config_labels.html#httpd.label_copyAllScoresIfNoCodeChange">
configured to copy scores forward to new patch sets if there is no code change</a>.
</p>
</li>
<li>
<p>
Labels can be
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config_labels.html#httpd.label_copyAllScoresOnTrivialRebase">
configured to copy scores forward to new patch sets for trivial rebases</a>.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_web_ui">Web UI</h3>
<div class="sect3">
<h4 id="_global">Global</h4>
<div class="ulist"><ul>
<li>
<p>
The change status is shown in a separate column on dashboards and search results.
</p>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_change_screens">Change Screens</h4>
<div class="ulist"><ul>
<li>
<p>
New change screen with completely redesigned UI, using the REST API.
</p>
<div class="paragraph"><p>Site administrators can
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-gerrit.html#gerrit.changeScreen">
configure which change screen is shown by default</a>.</p></div>
<div class="paragraph"><p>Users can choose which one to use in their personal preferences, either using
the site default or explicitly choosing the old one or new one.</p></div>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=141">Issue 141</a>:
In the new change screen, comments can be added on a range of lines.
</p>
</li>
<li>
<p>
New button to cherry-pick the change to another branch.
</p>
</li>
<li>
<p>
When issuing a rebase via the Web UI, the committer is now the logged in
  user, rather than "Gerrit Code Review".
</p>
<div class="paragraph"><p>If the user has more than one email address, the preferred email address will
be used.</p></div>
</li>
<li>
<p>
Default user&#8217;s full name to git committer name if user has not configured a
full name in their profile.
</p>
</li>
<li>
<p>
Include comment author attributes in comment panels.
</p>
<div class="paragraph"><p>Comment author&#8217;s email address and name are included as attributes in comment
panels.  This makes it easier to filter out CI-based comments using user
scripts.</p></div>
</li>
<li>
<p>
Copy reviewed flag to new patch sets for identical files.
</p>
<div class="paragraph"><p>If a user has already seen and reviewed a file, the <em>reviewed</em> flag is forwarded
on to the next patch set when the content of the file in the next patch set is
identical to the reviewed file.</p></div>
</li>
<li>
<p>
"Uploaded Patch Set 1" change message is added on changes when they
are uploaded.
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect2">
<h3 id="_rest_api">REST API</h3>
<div class="ulist"><ul>
<li>
<p>
Several new <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api.html">
REST API endpoints</a> are added.
</p>
</li>
<li>
<p>
REST views can determine how long their response should be cached.
</p>
</li>
<li>
<p>
REST views can handle <em>HTTP 422 Unprocessable Entity</em> responses.
</p>
</li>
</ul></div>
<div class="sect3">
<h4 id="_access_rights">Access Rights</h4>
<div class="ulist"><ul>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-access.html#list-access">
List access rights for project(s)</a>
</p>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_accounts">Accounts</h4>
<div class="ulist"><ul>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#create-account">
Create account</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#get-account-name">
Get account full name</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#set-account-name">
Set account full name</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#delete-account-name">
Delete account full name</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#list-account-emails">
List account email addresses</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#get-account-email">
Get account email address</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#set-preferred-email">
Set account preferred email address</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#create-account-email">
Create account email</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#delete-account-email">
Delete account email</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#get-active">
Get account state</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#set-active">
Set account state to active</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#delete-active">
Set account state to inactive</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#get-http-password">
Get account HTTP password</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#set-http-password">
Set or generate account HTTP password</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#delete-http-password">
Delete account HTTP password</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#list-ssh-keys">
List account SSH keys</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#get-ssh-key">
Get account SSH key</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#add-ssh-key">
Add account SSH key</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#delete-ssh-key">
Delete account SSH key</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-accounts.html#get-username">
Get account username</a>
</p>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_changes">Changes</h4>
<div class="ulist"><ul>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#rebase-change">
Rebase change</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#cherry-pick">
Cherry-pick revision</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#get-content">
Get content of a file in a revision</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#get-patch">
Get revision as a formatted patch</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#get-diff">
Get diff of a file in a revision</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#get-commit">
Get parsed commit of a revision</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#publish-draft-change">
Publish draft change</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#delete-draft-change">
Delete draft change</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#suggest-reviewers">
Suggest reviewers</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-changes.html#get-included-in">
Get included in</a>
</p>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_config">Config</h4>
<div class="ulist"><ul>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-config.html#get-capabilities">
Get capabilities</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-config.html#get-version">
Get version</a> (of the Gerrit server)
</p>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_projects">Projects</h4>
<div class="ulist"><ul>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#list-branches">
List branches</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#get-branch">
Get branch</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#create-branch">
Create branch</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#delete-branch">
Delete branch</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#list-child-projects">
List child projects</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#get-child-project">
Get child project</a>
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#set-config">
Set configuration</a>
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect2">
<h3 id="_capabilities">Capabilities</h3>
<div class="paragraph"><p>New global capabilities are added.</p></div>
<div class="ulist"><ul>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/access_control.html#capability_generateHttpPassword">
Generate Http Password</a> allows non-administrator users to generate HTTP
passwords for users other than themselves.
</p>
<div class="paragraph"><p>This capability would typically be assigned to a non-interactive group
to be able to generate HTTP passwords for users from a tool or web service
that uses the Gerrit REST API.</p></div>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/access_control.html#capability_runAs">
Run As</a> allows users to impersonate other users by setting the <tt>X-Gerrit-RunAs</tt>
HTTP header on REST API calls.
</p>
<div class="paragraph"><p>Site administrators do not inherit this capability;  it must be granted
explicitly.</p></div>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_emails">Emails</h3>
<div class="ulist"><ul>
<li>
<p>
The <tt>RebasedPatchSet</tt> template is removed.  Email notifications for rebased
changes are now sent with the <tt>ReplacePatchSet</tt> template.
</p>
</li>
<li>
<p>
Comment notification emails now include context of comments that are replied
to, and links to the file(s) in which comments are made.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_plugins">Plugins</h3>
<div class="sect3">
<h4 id="_global_2">Global</h4>
<div class="ulist"><ul>
<li>
<p>
Plugins may now contribute buttons to various parts of the UI using the
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#ui_extension">
UI extension</a> and
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/js-api.html">
JavaScript API</a>.
</p>
</li>
<li>
<p>
Plugins may now provide an <em>About</em> section on their documentation index page.
</p>
</li>
<li>
<p>
Plugins may now provide separate sections for REST API and servlet
documentation on their index page.
</p>
</li>
<li>
<p>
Plugins may now provide
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-validation.html#pre-merge-validation">
pre-merge validation steps</a>.
</p>
</li>
<li>
<p>
Plugins may now provide
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#capabilities">
Global capabilities</a>.
</p>
</li>
<li>
<p>
Plugins may now
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#plugin_name">
define their own name</a> and get the name injected at runtime.
</p>
</li>
<li>
<p>
The "hello world" plugin is replaced with the "cookbook plugin" which has more
examples of the plugin API&#8217;s usage.
</p>
</li>
<li>
<p>
Plugins may now trigger and listen to a "project deleted"
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#events">
event</a>.
</p>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=2101">Issue 2101</a>:
Plugins implementing LifecycleListener can use auto registration.
</p>
</li>
<li>
<p>
Plugins may bind REST endpoints with empty view names.
</p>
</li>
<li>
<p>
Plugins may now provide
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#top-menu-extensions">
entries in Gerrit&#8217;s top menu</a>.
</p>
</li>
<li>
<p>
Plugins may now
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#stream-events">
send events to the events stream</a>.
</p>
</li>
<li>
<p>
Plugins may now bind multiple SSH commands to the same implementation class.
</p>
</li>
<li>
<p>
Plugins may now provide
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#download-commands">
download schemes and download commands</a>.
</p>
<div class="paragraph"><p>Commonly used download schemes and commands are moved out of core
Gerrit and are now implemented by a new core plugin, <tt>download-commands</tt>.</p></div>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_commit_message_length_checker">Commit Message Length Checker</h4>
<div class="ulist"><ul>
<li>
<p>
Commits whose subject or body length exceeds the limit can be rejected.
</p>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_replication">Replication</h4>
<div class="ulist"><ul>
<li>
<p>
Automatically create missing repositories on the destination.
</p>
<div class="paragraph"><p>If during the replication of a ref the target repository is found to be missing,
the repository is automatically created.</p></div>
<div class="paragraph"><p>This is a change in behavior of the replication plugin. To go back to the old
behavior, set the parameter <tt>remote.NAME.createMissingRepositories</tt> in the
<tt>replication.config</tt> file to <tt>false</tt>.</p></div>
</li>
<li>
<p>
Support for replication of project deletions.
</p>
<div class="paragraph"><p>The replication plugin can now be configured to listen to project deletion events
and to replicate the project deletions. By default project deletions are <strong>not</strong>
replicated.</p></div>
</li>
<li>
<p>
The <tt>{$name}</tt> placeholder is optional when replicating a single project,
allowing a single project to be replicated under a different name.
</p>
</li>
<li>
<p>
Project names can be matched with wildcard or regex patterns in <tt>replication.config</tt>.
</p>
</li>
<li>
<p>
The <tt>replication start</tt> command does not exit until replication is finished
when the <tt>--wait</tt> option is used.
</p>
</li>
<li>
<p>
The <tt>replication start</tt> command displays a summary of the replication status.
</p>
</li>
<li>
<p>
Retry counts are added to replication task names, so they can be seen in the
output of the <tt>show-queue</tt> command.
</p>
</li>
<li>
<p>
The <tt>remoteNameStyle</tt> option can be set to <tt>basenameOnly</tt> to replicate projects
using only the basename on the target server.
</p>
</li>
<li>
<p>
The <tt>startReplication</tt> global capability is now provided by the plugin.
</p>
</li>
<li>
<p>
Pushes to each destination URI are serialized.
</p>
<div class="paragraph"><p>Scheduling a retry to avoid collision with an in-flight push is differentiated
from a retry due to a transport error.  In the case of collision avoidance, the
job is rescheduled according to the replication delay, rather than the retry
delay.</p></div>
</li>
</ul></div>
</div>
</div>
<div class="sect2">
<h3 id="_ssh">ssh</h3>
<div class="ulist"><ul>
<li>
<p>
The <tt>commit-msg</tt> hook installation command is now
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config_gerrit.html#gerrit.installCommitMsgHookCommand">
configurable</a>.
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-ls-members.html">
New <tt>ls-members</tt> command</a>.
</p>
</li>
<li>
<p>
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-set-members.html">
New <tt>set-members</tt> command</a>.
</p>
<div class="paragraph"><p>New command to manipulate group membership. Members can be added or removed
and groups can be included or excluded in one specific group or number of groups.</p></div>
</li>
<li>
<p>
The full commit message is now included in the data sent by the
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-stream-events.html">
<tt>stream-events</tt> command</a>.
</p>
</li>
<li>
<p>
The <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-show-queue.html">
<tt>show-queue</tt> command</a> now shows the time that a task was added to the queue.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_daemon">Daemon</h3>
<div class="ulist"><ul>
<li>
<p>
Add <tt>--init</tt> option to Daemon to initialize site on daemon start.
</p>
<div class="paragraph"><p>The <tt>--init</tt> option will also upgrade an already existing site and is processed in
non-interactive (batch) mode.</p></div>
</li>
</ul></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_bug_fixes">Bug Fixes</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_general">General</h3>
<div class="ulist"><ul>
<li>
<p>
Use the parent change on the same branch for rebases.
</p>
<div class="paragraph"><p>Since there can be multiple changes with the same commit on different branches,
use the parent change on the same branch during rebase.</p></div>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=600">Issue 600</a>:
Fix change stuck in SUBMITTED state but actually merged.
</p>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=1699">Issue 1699</a>:
Fix handling of projects with trailing ".git" suffix.
</p>
</li>
<li>
<p>
Limit retrying of submitted changes to 12 hours.
</p>
</li>
<li>
<p>
Don&#8217;t allow project owners to delete branches if force push is blocked.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_configuration_2">Configuration</h3>
<div class="ulist"><ul>
<li>
<p>
Do not persist default project state in <tt>project.config</tt>.
</p>
</li>
<li>
<p>
Honor the <tt>gerrit.cannonicalWebUrl</tt> setting when opening the browser after init.
</p>
</li>
<li>
<p>
Fix <em>query disabled</em> error when Query Limit is set.
</p>
</li>
<li>
<p>
Honor the <tt>gerrit.createChangeId</tt> setting from the git config in the
The <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-hook-commit-msg.html">
<tt>commit-msg</tt> hook</a>.
</p>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=2045">Issue 2045</a>:
Define user scope when parsing server config.
</p>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=1990">Issue 1990</a>:
Support optional Certificate Revocation List (CRL) with <tt>CLIENT_SSL_CERT_LDAP</tt>.
</p>
</li>
<li>
<p>
Do not override error and gc logging configuration provided by the
<tt>-Dlog4j.configuration</tt> parameter.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_web_ui_2">Web UI</h3>
<div class="sect3">
<h4 id="_global_3">Global</h4>
<div class="ulist"><ul>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=1574">Issue 1574</a>:
Correctly highlight matches of text in escaped HTML entities in suggestion results.
</p>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=1996">Issue 1996</a>:
The "Keyboard Shortcuts" help popup can be closed by pressing the Escape key.
</p>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=2013">Issue 2013</a>:
Correctly populate the list of watched changes when watching more than one project.
</p>
</li>
<li>
<p>
Display "Working&#8230;" when header is hidden.
</p>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_change_screens_2">Change Screens</h4>
<div class="ulist"><ul>
<li>
<p>
Default review comment visibility is changed to expand all recent.
</p>
<div class="paragraph"><p>By default all comments within the last week are expanded, rather than
only the most recent.</p></div>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=1814">Issue 1814</a>:
Sort labels alphabetically by name in the approval table.
</p>
</li>
<li>
<p>
Don&#8217;t add "This patchset was cherry picked to &#8230;" for the same change.
</p>
<div class="paragraph"><p>If a patchset is cherry-picked to the same destination branch and
ends up on the same change, it does not make sense to add the "This
patchset was cherry picked to change &#8230;" message.</p></div>
<div class="paragraph"><p>In this case, it makes more sense for the message to say "Uploaded
patch set N" instead.</p></div>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_project_screens">Project Screens</h4>
<div class="ulist"><ul>
<li>
<p>
Only enable the delete branch button when branches are selected.
</p>
</li>
<li>
<p>
Disable the delete branch button while branch deletion requests are
still being processed.
</p>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_user_profile_screens">User Profile Screens</h4>
<div class="ulist"><ul>
<li>
<p>
The preferred email address field is shown as empty if the user has no
preferred email address.
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect2">
<h3 id="_rest_api_2">REST API</h3>
<div class="ulist"><ul>
<li>
<p>
Support raw input also in POST requests.
</p>
</li>
<li>
<p>
Show granted date for labels/all when using <tt>/changes/</tt>.
</p>
</li>
<li>
<p>
Return all revisions when <tt>o=ALL_REVISIONS</tt> is set on <tt>/changes/</tt>.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_ssh_2">ssh</h3>
<div class="ulist"><ul>
<li>
<p>
The <tt>--force-message</tt> option is removed from the
The <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-review.html">
<tt>review</tt> command</a>.
</p>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=1908">Issue 1908</a>:
Provide more informative error messages when rejecting updates.
</p>
</li>
<li>
<p>
Remove the limit in the query of patch sets by revision.
</p>
</li>
<li>
<p>
Add <tt>isDraft</tt> in the <tt>patchSet</tt> attribute of <tt>stream-events</tt> data.
</p>
<div class="paragraph"><p>This allows consumers of the event stream to determine whether or not
the event is related to a draft patch set.</p></div>
</li>
<li>
<p>
Normalize the case of review labels submitted via the
The <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-review.html">
<tt>review</tt> command</a>.
</p>
</li>
<li>
<p>
The <tt>@CommandMetaData(descr)</tt> annotation is deprecated in favor of <tt>@CommandMetaData(description)</tt>.
</p>
</li>
<li>
<p>
Improve the error message when rejecting upload for review to a read-only project.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_plugins_2">Plugins</h3>
<div class="sect3">
<h4 id="_global_4">Global</h4>
<div class="ulist"><ul>
<li>
<p>
Better error message when a Javascript plugin cannot be loaded.
</p>
</li>
<li>
<p>
Plugin documentation links are opened in a new tab.
</p>
</li>
<li>
<p>
The GitReferenceUpdatedListener.Event API is simplified.
</p>
<div class="paragraph"><p>The Event exposed the getUpdates method which implied that one Event
could contain updates of more than one reference. However, this feature
was never used.</p></div>
<div class="paragraph"><p>The API is simplified in the sense that one Event now corresponds to
one ref update only.</p></div>
</li>
</ul></div>
</div>
<div class="sect3">
<h4 id="_review_notes">Review Notes</h4>
<div class="ulist"><ul>
<li>
<p>
Do not try to create review notes for ref deletion events.
</p>
</li>
<li>
<p>
Fix committing the notes from the export command.
</p>
</li>
<li>
<p>
<a href="https://code.google.com/p/gerrit/issues/detail?id=2087">Issue 2087</a>:
Fix note creation when the same commit exists in another Git repository.
</p>
</li>
<li>
<p>
Improve the export command performance.
</p>
</li>
<li>
<p>
Create review note also when newObjectId already present in another branch.
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect2">
<h3 id="_emails_2">Emails</h3>
<div class="ulist"><ul>
<li>
<p>
Email notifications are sent for new changes created via actions in the
Web UI such as cherry-picking or reverting a change.
</p>
</li>
</ul></div>
</div>
<div class="sect2">
<h3 id="_tools">Tools</h3>
<div class="ulist"><ul>
<li>
<p>
git-exproll.sh: return non-zero on errors
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_documentation">Documentation</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
The <a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/index.html">
documentation index page</a> is rewritten in a hierarchical structure.
</p>
</li>
<li>
<p>
Documentation of
<a href="http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-project-config.txt">
project configuration</a> is added.
</p>
</li>
<li>
<p>
Various spelling mistakes are corrected in the documentation and previous
release notes.
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_upgrades">Upgrades</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
Update JGit to 3.0.0.201306101825-r.41-g84d2738
</p>
</li>
<li>
<p>
Update gwtorm to 1.7
</p>
</li>
<li>
<p>
Update guice to 4.0-beta
</p>
</li>
<li>
<p>
Update guava to 15.0
</p>
</li>
<li>
<p>
Update H2 to 1.3.173
</p>
</li>
<li>
<p>
Update bouncycastle to 1.44
</p>
</li>
<li>
<p>
asciidoctor 0.1.4 is now required to build the documentation
</p>
</li>
<li>
<p>
jsr305 library was removed
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Version 2.8 (from v2.8-rc0)<br />
Last updated 2013-10-16 20:30:33 PDT
</div>
</div>
</body>
</html>
